/*
 * builder.h
 *
 */

#ifndef BUILDER_H_
#define BUILDER_H_
#include "../modelo/Entidad.h"
#include "../modelo/Personaje.h"
#include "../modelo/Escenario.h"
#include "../modelo/Pantalla.h"
#include "ArbolSintactico.h"
#include "Logger.h"
#include "../constantes.h"
#include "../modelo/TipoEntidad.h"
#include "../vista/AccionTipoEntidad.h"
#include <stdlib.h>
#include <map>
#include <list>
#include <cctype>
#include "../modelo/Juego.h"
#include "../modelo/bonus/BonusVelocidad.h"
#include "../modelo/bonus/BonusVida.h"
#include "../modelo/bonus/BonusMagia.h"
#include "../modelo/bonus/BonusMapa.h"
#include "../modelo/bonus/BonusLampara.h"
#include "../modelo/bonus/BonusBomba.h"
#include "../modelo/bonus/BonusGolem.h"
#include "../modelo/bonus/BonusHielo.h"
#include "../modelo/EnemigoAutomata.h"

using namespace std;

class Builder {

private:

	int x_max;
	int y_max;
	ArbolSintactico arbol;
	map<string,TipoEntidad*> mapaTipoEntidad;
	Logger* logger;
	string path;
	int chequearValoresNumericos(string s, int defaultADevolver);
	bool estaDentroDeRango(int &n, int maximo);
	void chequearCasillerosDentroDeTablero(int & x,int & y);
	map<string,AccionTipoEntidad*> crearMapaAccionesEImagenes(string nombrePersonaje, Nodo* nodoAcciones, TipoEntidad* tipoEntidad);
	void cargaMapAccion(string nombreAccion,string direccion, TipoEntidad* tipoEntidad,map<string, AccionTipoEntidad*>* mapa );
	void loguearErroresVarios();
	void inicializarCantFramesAutomatas(Escenario* unEscenario);


public:

	Builder(string path);
	Pantalla* obtenerPantalla();
	map<string,TipoEntidad*> obtenerTipoEntidades();
	Escenario* obtenerEscenario();
	list<Entidad*> obtenerEntidades();
	list<Personaje*> obtenerProtagonistas();
	list<Personaje*> obtenerPersonajes(string aBuscar, int velocidad);
	map<string,TipoEntidad*> getMapaTipoEntidad();
	Juego* crearJuegoServer();
	Juego* crearJuegoCliente();
	ArbolSintactico getArbol();
	TipoEntidad* getTipoEntidad(string nombreTipoEntidad);
	list<Personaje*> obtenerAutomatas();
	pair<int,int> obtenerPosicionJefe();
	virtual ~Builder();
};

#endif
